﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;

namespace AccesoBD
{
    public class ListadosOrdenLlegada
    {

        public static bool eliminarItemListado(long nrhc, TimeSpan hora) 
        {
            bool res = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "delete from Listado_OrdenLLegada where nroHCpaciente=@nrhc and horaLLegada=@hora";
                List<SqlParameter> lst = new List<SqlParameter>();
                lst.Add(new SqlParameter("@nrhc", nrhc));
                lst.Add(new SqlParameter("@hora", hora));
                int fila = DB.EjecutarCommand(comando, lst, con, tran);
                if (fila>0)
                {
                    res = true;
                    tran.Commit();

                    
                }


            }
            catch (Exception)
            {
                if (tran!=null)
                {
                    tran.Rollback();
                    res = false;
                    
                }
                throw;
            }
            finally 
            {
                con.Close();
            }
            return res;
        
        }
        public static List<ItemListadoOrdenLlegada> obtenerListadoEspMedico(int idEsp, long legajo, DateTime fecha)
        {
            List<ItemListadoOrdenLlegada> listado = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Listado_OrdenLLegada.idItemListadoOrdenLlegada, Listado_OrdenLLegada.horaLLegada, Listado_OrdenLLegada.nroOrden, Listado_OrdenLLegada.fechaAtencion, Listado_OrdenLLegada.idEspecialidad, "
                                + "Listado_OrdenLLegada.legajoMed, Listado_OrdenLLegada.nroHCpaciente, Listado_OrdenLLegada.idPersonaPaciente, Listado_OrdenLLegada.atendido, Listado_OrdenLLegada.cobrado, "
                                + "Listado_OrdenLLegada.observaciones, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente "
                                + "FROM Listado_OrdenLLegada INNER JOIN Paciente ON Listado_OrdenLLegada.nroHCpaciente = Paciente.nroHC AND Listado_OrdenLLegada.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE (CAST(fechaAtencion as Date) = CAST(@fechaAtencion as DATE)) AND (idEspecialidad = @idEsp) AND (legajoMed = @legajo)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idEsp", idEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAtencion", fecha));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listado = new List<ItemListadoOrdenLlegada>();
                    ItemListadoOrdenLlegada item = null;
                    while (dr.Read())
                    {
                        item = new ItemListadoOrdenLlegada();
                        item.idItemListado = long.Parse(dr["idItemListadoOrdenLlegada"].ToString());
                        item.nroOrden = int.Parse(dr["nroOrden"].ToString());
                        item.fechaListado = DateTime.Parse(dr["fechaAtencion"].ToString());
                        
                        //especialidad medico
                        item.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        item.LegajoMedico = long.Parse(dr["legajoMed"].ToString());
                        
                        //paciente
                        item.nroHCpaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        item.idPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        item.ApellidoNombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                        item.horaLLegada = (TimeSpan)dr["horaLLegada"];
                        item.Atendido = bool.Parse(dr["atendido"].ToString());
                        item.Cobrado = bool.Parse(dr["cobrado"].ToString());
                        if (dr["observaciones"] == DBNull.Value)
                            item.Observaciones = null;
                        else
                            item.Observaciones = dr["observaciones"].ToString();

                        listado.Add(item);
                        item = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listado;
        }
        //OBTENER LISTADO ORDEN LLEGADA DE NO ATENDIDOS POR ESPECIALIDAD Y MEDICO
        public static List<ItemListadoOrdenLlegada> obtenerListadoEspMedicoNoAtendidos(int idEsp, long legajo, DateTime fecha)
        {
            List<ItemListadoOrdenLlegada> listado = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Listado_OrdenLLegada.idItemListadoOrdenLlegada, Listado_OrdenLLegada.nroOrden, Listado_OrdenLLegada.fechaAtencion, Listado_OrdenLLegada.idEspecialidad, "
                                + "Listado_OrdenLLegada.legajoMed, Listado_OrdenLLegada.nroHCpaciente, Listado_OrdenLLegada.idPersonaPaciente, Listado_OrdenLLegada.atendido, Listado_OrdenLLegada.cobrado, "
                                + "Listado_OrdenLLegada.observaciones, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente "
                                + "FROM Listado_OrdenLLegada INNER JOIN Paciente ON Listado_OrdenLLegada.nroHCpaciente = Paciente.nroHC AND Listado_OrdenLLegada.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE (CAST(fechaAtencion as Date) = CAST(@fechaAtencion as DATE)) AND (idEspecialidad = @idEsp) AND (legajoMed = @legajo) and Listado_OrdenLLegada.atendido='false'";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idEsp", idEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAtencion", fecha));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listado = new List<ItemListadoOrdenLlegada>();
                    ItemListadoOrdenLlegada item = null;
                    while (dr.Read())
                    {
                        item = new ItemListadoOrdenLlegada();
                        item.IdItemListadoOrdenLlegada = int.Parse(dr["idItemListadoOrdenLlegada"].ToString());
                        item.nroOrden = int.Parse(dr["nroOrden"].ToString());
                        item.fechaListado = DateTime.Parse(dr["fechaAtencion"].ToString());

                        //especialidad medico
                        item.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        item.LegajoMedico = long.Parse(dr["legajoMed"].ToString());

                        //paciente
                        item.nroHCpaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        item.idPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        item.ApellidoNombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                        item.horaLLegada = (TimeSpan)dr["horaLLegada"];
                        item.Atendido = bool.Parse(dr["atendido"].ToString());
                        item.Cobrado = bool.Parse(dr["cobrado"].ToString());
                        if (dr["observaciones"] == DBNull.Value)
                            item.Observaciones = null;
                        else
                            item.Observaciones = dr["observaciones"].ToString();

                        listado.Add(item);
                        item = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listado;
        }
        public static List<ItemListadoOrdenLlegada> obtenerListadoEspMedicoNoAtendidos( DateTime fecha)
        {
            List<ItemListadoOrdenLlegada> listado = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Listado_OrdenLLegada.idItemListadoOrdenLlegada, Listado_OrdenLLegada.nroOrden, Listado_OrdenLLegada.fechaAtencion, Listado_OrdenLLegada.idEspecialidad, "
                                + "Listado_OrdenLLegada.legajoMed, Listado_OrdenLLegada.nroHCpaciente, Listado_OrdenLLegada.idPersonaPaciente, Listado_OrdenLLegada.atendido, Listado_OrdenLLegada.cobrado, "
                                + "Listado_OrdenLLegada.observaciones, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente,Listado_OrdenLLegada.horaLLegada "
                                + "FROM Listado_OrdenLLegada INNER JOIN Paciente ON Listado_OrdenLLegada.nroHCpaciente = Paciente.nroHC AND Listado_OrdenLLegada.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE (CAST(fechaAtencion as Date) = CAST(@fechaAtencion as DATE)) and Listado_OrdenLLegada.atendido='false'";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
               sqlcmd.Parameters.Add(new SqlParameter("@fechaAtencion", fecha));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listado = new List<ItemListadoOrdenLlegada>();
                    ItemListadoOrdenLlegada item = null;
                    while (dr.Read())
                    {
                        item = new ItemListadoOrdenLlegada();
                        item.IdItemListadoOrdenLlegada = int.Parse(dr["idItemListadoOrdenLlegada"].ToString());
                        item.nroOrden = int.Parse(dr["nroOrden"].ToString());
                        item.fechaListado = DateTime.Parse(dr["fechaAtencion"].ToString());

                        //especialidad medico
                        item.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        item.LegajoMedico = long.Parse(dr["legajoMed"].ToString());

                        //paciente
                        item.nroHCpaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        item.idPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        item.ApellidoNombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                        //Listado
                        item.horaLLegada = (TimeSpan)dr["horaLLegada"];
                        item.Atendido = bool.Parse(dr["atendido"].ToString());
                        item.Cobrado = bool.Parse(dr["cobrado"].ToString());
                        if (dr["observaciones"] == DBNull.Value)
                            item.Observaciones = null;
                        else
                            item.Observaciones = dr["observaciones"].ToString();

                        listado.Add(item);
                        item = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listado;
        }
        public static bool registrarItemEnListado(ItemListadoOrdenLlegada itemNuevo)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "INSERT INTO Listado_OrdenLLegada (nroOrden, fechaAtencion, idEspecialidad, legajoMed, nroHCpaciente, idPersonaPaciente) "
                                + "VALUES (@nroOrden,@fechaAtencion,@idEsp,@legajo,@nroHC,@idPersona)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroOrden", itemNuevo.nroOrden));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAtencion", itemNuevo.fechaListado));
                sqlcmd.Parameters.Add(new SqlParameter("@idEsp", itemNuevo.IdEspecialidad));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", itemNuevo.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", itemNuevo.nroHCpaciente));
                sqlcmd.Parameters.Add(new SqlParameter("@idPersona", itemNuevo.idPersona));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
       //OBTENER LISTADO ORDEN LLEGADA POR IDITEM
        public static ItemListadoOrdenLlegada obtenerListadoPorItem(long i)
        {
            List<ItemListadoOrdenLlegada> listado = null;
            ItemListadoOrdenLlegada item=null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Listado_OrdenLLegada.idItemListadoOrdenLlegada, Listado_OrdenLLegada.nroOrden, Listado_OrdenLLegada.fechaAtencion, Listado_OrdenLLegada.idEspecialidad, "
                                + "Listado_OrdenLLegada.legajoMed, Listado_OrdenLLegada.nroHCpaciente, Listado_OrdenLLegada.idPersonaPaciente, Listado_OrdenLLegada.atendido, Listado_OrdenLLegada.cobrado, Listado_OrdenLLegada.idEstado,Listado_OrdenLLegada.horaLLegada, "
                                + "Listado_OrdenLLegada.observaciones, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente "
                                + "FROM Listado_OrdenLLegada INNER JOIN Paciente ON Listado_OrdenLLegada.nroHCpaciente = Paciente.nroHC AND Listado_OrdenLLegada.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE Listado_OrdenLLegada.idItemListadoOrdenLlegada=@itemListado";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@itemListado", i));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    listado = new List<ItemListadoOrdenLlegada>();
                     item = null;
                    while (dr.Read())
                    {
                        item = new ItemListadoOrdenLlegada();
                        item.IdItemListadoOrdenLlegada = int.Parse(dr["idItemListadoOrdenLlegada"].ToString());
                        item.nroOrden = int.Parse(dr["nroOrden"].ToString());
                        item.fechaListado = DateTime.Parse(dr["fechaAtencion"].ToString());

                        //especialidad medico
                        item.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        item.LegajoMedico = long.Parse(dr["legajoMed"].ToString());

                        //paciente
                        item.nroHCpaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        item.idPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        item.ApellidoNombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                        item.horaLLegada = (TimeSpan)dr["horaLLegada"];
                        item.Atendido = bool.Parse(dr["atendido"].ToString());
                        item.Cobrado = bool.Parse(dr["cobrado"].ToString());
                        item.idEstado = (int)dr["idEstado"];
                        if (dr["observaciones"] == DBNull.Value)
                            item.Observaciones = null;
                        else
                            item.Observaciones = dr["observaciones"].ToString();

                        listado.Add(item);
                       
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return item;
        }
        //ESTE ES PARECIDO AL ANTERIOR SOLAMENTE QUE OBTENGO EL MAX NROORDEN PARA REGISTRARLO, 
        public static bool registrarLLegadaListado(ItemListadoOrdenLlegada itemNuevo, out long id) 
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction tran=conexion.BeginTransaction();
            id = 0;
            try
            {
                string comando = "INSERT INTO Listado_OrdenLLegada (nroOrden, fechaAtencion, idEspecialidad, legajoMed, nroHCpaciente, idPersonaPaciente,atendido,cobrado,horaLLegada,idEstado) "
                                + "VALUES (@nroOrden,@fechaAtencion,@idEsp,@legajo,@nroHC,@idPersona,@atendido,@cobrado,@horaLLegada,@idEstado)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion,tran);
               int nro= obtenerNumeroOrden(conexion, tran);
               if (nro==0)
               {
                   sqlcmd.Parameters.Add(new SqlParameter("@nroOrden", 1));
               }
               else
               {
                   nro=nro + 1;
                sqlcmd.Parameters.Add(new SqlParameter("@nroOrden", nro));
               }
                
                sqlcmd.Parameters.Add(new SqlParameter("@fechaAtencion", itemNuevo.fechaListado));
                sqlcmd.Parameters.Add(new SqlParameter("@idEsp", itemNuevo.IdEspecialidad));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", itemNuevo.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", itemNuevo.nroHCpaciente));
                sqlcmd.Parameters.Add(new SqlParameter("@idPersona", itemNuevo.idPersona));
                sqlcmd.Parameters.Add(new SqlParameter("@atendido", itemNuevo.Atendido));
                sqlcmd.Parameters.Add(new SqlParameter("@cobrado", itemNuevo.Cobrado));
                sqlcmd.Parameters.Add(new SqlParameter("@horaLLegada", itemNuevo.horaLLegada));
                sqlcmd.Parameters.Add(new SqlParameter("@idEstado", itemNuevo.idEstado));




                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                {
                    long numero = obtenerNumeroItem(conexion,tran);
                    itemNuevo.idItemListado = numero;
                    id = numero;
                    tran.Commit();
                    res = true;
                }

            }
            catch (Exception)
            {
                if (tran!=null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
               
        }
        public static long obtenerNumeroItem(SqlConnection con, SqlTransaction tran)
        {
            long res = 0;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "select Max(idItemListadoOrdenLlegada) from Listado_OrdenLLegada";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                List<SqlParameter> lsp = new List<SqlParameter>();
                string resu = DB.EjecutarScalar(comando, lsp, con, tran);
                if (!string.IsNullOrEmpty(resu))
                {
                    res = long.Parse(resu);
                }



            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
            }
            return res;
        }
        public static int obtenerNumeroOrden(SqlConnection con,SqlTransaction tran)
        {
            int res = 0;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "select Max(nroOrden) from Listado_OrdenLLegada";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                List<SqlParameter>lsp=new List<SqlParameter>();
                string resu = DB.EjecutarScalar(comando,lsp,con,tran);
                if (!string.IsNullOrEmpty(resu))
                {
                    res = int.Parse(resu);
                }
                
                    

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
            }
            return res;
        }

    }
}
